package com.tedu.API.io;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * IO：传输数据   C/S  聊天室 Version
 * API上部分：字符串、包装类、日期类、集合
 * ---------电脑三大件：CPU  硬盘  内存
 * API下部分：IO流    ---硬盘----文件数据传输
 *
 * 包位置：java.io
 * File文件、文件夹类
 *作用：用于表示操作系统中系统的一个文件或者“目录：文件夹”
 *创建File对象---->有参构造器--->“路径+文件/文件夹全称”
 *
 * File类方法使用：
 * 1.查看该文件或者”文件夹:目录“的属性信息(名字、大小、是否存在)
 * 2.操作文件或者”文件夹:目录“（创建、删除）
 * 3.访问一个“文件夹：目录”的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
        //创建文件类
        //需求：当前API下创建文件---手动--demo.txt
     //   File file=new File("D:\\java-api\\API\\src\\main\\java\\com\\tedu\\API\\io\\demo.txt");

       //相对路径--当前API下创建文件     Maven结构  main编写代码
        //FileAPI  相对于  API  项目下--->从src开始
        //操作系统：路径 \  代表路径  文件上传至服务器  √
        //             /  代表路径   文件下载到本地
        //java任何平台【操作系统】运行  统一路径属性
        //File.separator 静态属性：任何操作系统下转换成正确的路径表示方法   使用这个
        File file = new File("src" + File.separator + "main" +
                File.separator + "java" +
                File.separator + "com" +
                File.separator + "tedu" +
                File.separator + "API" +
                File.separator + "io" +
                File.separator + "demo.txt");
        //判断文件是否存在的方法
        boolean b = file.exists();
        System.out.println("判断文件是否存在：" + b);
    }
    /**
     * 查看文件或者文件夹属性信息“
     * getName()  返回值：String
     * 作用：获取文件的名字【注意：不看路径是否对错】
     *
     * length()   返回值：long
     * 作用：返回当前文件的大小【字节量】
     *
     * exists()  返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类---路径：Maven项目--相对路径
        //相对路径：./  当前API项目下
        File file=new File("."+File.separator+"demo.txt");
        //打印 file 的路径
        System.out.println("打印file路径："+file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径文件是否存在："+file.exists());  //.1没有
        //获取文件/文件夹名称
        String name=file.getName();
        System.out.println("文件或者文件夹的名字："+name);
        //获取文件的“大小：字节量”
        long l=file.length();
        System.out.println("获取文件大小【字节量】："+l);
    }

    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成 API 项目文件夹下 自动创建 test.txt  文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称   ./test.txt
        File file=new File("."+
                ""+File.separator+"test.txt");
        //判断----如果文件不存在---创建
        //        如果文件存在----不创建
        if(!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创好啦~~私密马赛");
        }else{
            System.out.println("文件已经存在了，妈妈酱~~");
        }
    }

    /**
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的  test.txt
     */
    @Test
    public void testDelete(){
        //创建File类     路径：./test.txt    ./不写 代表 当前API项目
        File file=new File("test.txt");
        //判断 如果文件  存在--->删除
        //             不存在--->不删
        if (file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除");
        }else{
            System.out.println("文件已经删除了~~");
        }
    }
    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在 API  项目下创建一个文件夹  demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void testMkdir(){
        //创建File 文件/文件夹--->创建demo文件夹-->加 / abc / bcd
        File file=new File("demo"+
                ""+File.separator+"abc"+
                ""+File.separator+"bcd");
        //判断  如果文件不存在---创建文件夹
        //              存在---不创建
        if (!file.exists()){
            System.out.println("文件不存在");
            file.mkdirs();
            System.out.println("创建文件");
        }else{
            System.out.println("已经创建好了~~");
        }
    }
    /**
     * 作业1：删除多层文件夹 demo/abc/bcd 【不能使用递归】
     * 提示：构造器 new File(File parent,"子路径")
     */
    @Test
    public void testD(){
        File file1 = new File("demo");
        File file2 = new File(file1, "abc");
        File file3 = new File(file2, "bcd");
        if (file3.exists()) {
            file3.delete();
            System.out.println("删除bcd");}
        if (file2.exists()) {
            file2.delete();
            System.out.println("删除abc");}
        if (file1.exists()) {
            file1.delete();
            System.out.println("删除demo");}
    }
    @Test
    public void testA(){
        File parent=new File("demo");
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");
        child2.delete();
        child1.delete();
        parent.delete();
        System.out.println("已经删除了");
    }

    /**
     * 访问文件夹--->所有子项【文件夹和文件】
     * listFiles()     返回值：File[]   【数组】
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile()  返回值：boolean
     * 作用：判断是否为文件，是文件 true，反之  false
     * isDirectory 返回值：boolean
     * 作用：判断是否为文件夹，是文件夹 true，反之  false
     * 需求：获取 API 项目下  所有的文件夹文字
     */
    @Test
    public void test() throws IOException {
        //获取 API 项目
        File file=new File("."+File.separator);
        System.out.println(file.getCanonicalPath());
        //过滤：3个文件还有4个文件夹，过滤是文件夹
        if(file.isDirectory()){  //-----没有过滤效果---
            //获取到所有的文件夹
           File[] dir= file.listFiles();
           //遍历所有的文件夹名字
            for(int i=0;i<dir.length;i++){//i  拿到所有下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
}
